package com.ggy.ggyaiagent.agent.model;

import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;

import java.io.IOException;

/**
 * ReAct （Reasoning  and Acting ）思考-行动 模式的代理抽象类
 * 实现了思考-行动的循环模式
 *
 */
@Data
//生成 equals 和 hashcode 方法，同时包含父类的字段
@EqualsAndHashCode(callSuper = true)
public abstract class ReActAgent extends BaseAgent {

    /**
     * 处理当前状态并决定下一步
     * @return 是否需要执行 行动，true 表示需要执行，false 表示不需要执行
     */
    public abstract boolean think(SseEmitter emitter,String chatId) throws IOException;

    /**
     * 执行决定的行动
     * @return 行动执行结果
     */
    public abstract String act(SseEmitter emitter);

    /**
     * 执行单个步骤： 思考和行动
     * @return 步骤执行结果
     */
    @Override
    public String step(SseEmitter emitter ,String chatId) throws IOException {
         try{
             //思考决定，是否需要执行下一步
             boolean shouldAct = think(emitter,chatId);
             if(!shouldAct){
                 emitter.send("思考完成 - 无需行动");
                 return "思考完成 - 无需行动";
             }
             return act(emitter);
         }catch (Exception e){
             //记录异常日志，查看堆栈
             e.printStackTrace();
             emitter.send("执行错误: " + e.getMessage());
             emitter.complete();
             return "步骤执行失败：" + e.getMessage();
         }
    }
}
